package br.edu.ufcg.p1.barzin;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import br.edu.ufcg.p1.barzin.gui.PessoaCheckBox;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Pessoa;
import br.edu.ufcg.p1.barzin.model.Resumo;

public class PedidosFragment extends ListFragment {

	private ArrayAdapter<ResumoFiltrado> adapter;
	private ArrayAdapter<Pessoa> pessoaAdapter;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View view = inflater.inflate(R.layout.conta_fragment, container, false);

		((TextView) view.findViewById(R.id.CFPedidos)).setTextSize(35);
		((TextView) view.findViewById(R.id.valorTotal)).setTextSize(35);
		((TextView) view.findViewById(R.id.valorTotal))
		.setTextColor(0xFF74D700);
		((TextView) view.findViewById(R.id.textoTotal))
		.setTextColor(0xFF74D700);
		((TextView) view.findViewById(R.id.CF13)).setTextColor(0xFF74D700);
		((TextView) view.findViewById(R.id.CF3)).setTextSize(25);
		((TextView) view.findViewById(R.id.CF13)).setTextSize(25);

		pessoaAdapter = new PessoasArrayAdapter(getActivity(),
				R.layout.pessoas_conta_list_item);

		List<Pessoa> pessoas = App.environment().getDao().recuperaPessoas();
		for (Pessoa pessoa : pessoas) {
			pessoaAdapter.add(pessoa);
		}

		((ListView) view.findViewById(R.id.pessoasLV))
		.setAdapter(pessoaAdapter);

		((Button) view.findViewById(R.id.CF2))
		.setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				marcaTodos();
			}
		});

		((SeekBar) view.findViewById(R.id.seekBar1)).setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

//			@Override
			public void onStopTrackingTouch(SeekBar seekBar) { }

//			@Override
			public void onStartTrackingTouch(SeekBar seekBar) { }

//			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				String prog = String.format("%02d", progress);
				((TextView) getView().findViewById(R.id.porcentagem)).setText(prog+"%");
				atualizaTotal();
			}
		});

		return view;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		adapter = new PedidosArrayAdapter(getActivity(),
				R.layout.conta_list_item);

		//		marcaTodos();

		setListAdapter(adapter);
	}

	public void atualizaPessoas() {
		pessoaAdapter.clear();
		atualizaDados();

		//		double porcentagem = ((SeekBar) getView().findViewById(R.id.seekBar1)).getProgress()/100;

		List<Pessoa> pessoas = App.environment().getDao().recuperaPessoas();
		for (Pessoa pessoa : pessoas) {
			//			pessoa.setValor(pessoa.getValor() * porcentagem);
			pessoaAdapter.add(pessoa);
		}

	}

	protected void atualizaDados() {
		this.adapter.clear();

		List<Pessoa> pessoas = getPessoasChecked();
		List<Resumo> resumos = App.environment().getDao().recuperaResumos();

		double total = 0;
		double porcentagem = ((SeekBar) getView().findViewById(R.id.seekBar1)).getProgress();
		porcentagem = porcentagem != 0.0 ? 1 + (porcentagem/100.0) : 0.0;

		for (Resumo resumo : resumos) {
			ResumoFiltrado resumoFiltrado = new ResumoFiltrado(resumo.getItem()
					.getNome(), 0, 0);
			boolean flag = false;
			for (Pedido pedido : resumo.getPedidosAtendidos()) {
				for (Pessoa pessoa : pessoas) {
					if (pedido.getPessoas().contains(pessoa)) {
						flag = true;

						double parcela = ((double) pedido.getQuantidade())
								/ pedido.getPessoas().size();
						parcela = Math.round(parcela * 100.0) / 100.0;
						resumoFiltrado.addQnt(parcela);
						resumoFiltrado.addValor(pedido.getParcelaPorPessoa());
					}
				}
			}
			if (flag) {
				this.adapter.add(resumoFiltrado);
				total += resumoFiltrado.getValor();
			}
		}

		if (porcentagem > 0.0) {
			total *= porcentagem;
		}

		String nomes = getNomesPessoas();

		((TextView) getView().findViewById(R.id.CF13)).setText(nomes);
		((TextView) getView().findViewById(R.id.textoTotal))
		.setText("Total para: " + nomes);

		DecimalFormat df = new DecimalFormat("0.00");
		String valor = df.format(total).replace(".", ",");

		((TextView) getView().findViewById(R.id.valorTotal)).setText("R$"
				+ valor);
	}

	private void atualizaTotal() {
		List<Pessoa> pessoas = getPessoasChecked();
		List<Resumo> resumos = App.environment().getDao().recuperaResumos();

		double total = 0;
		double porcentagem = ((SeekBar) getView().findViewById(R.id.seekBar1)).getProgress();
		porcentagem = porcentagem != 0.0 ? 1 + (porcentagem/100.0) : 0.0;

		for (Resumo resumo : resumos) {
			ResumoFiltrado resumoFiltrado = new ResumoFiltrado(resumo.getItem()
					.getNome(), 0, 0);
			boolean flag = false;
			for (Pedido pedido : resumo.getPedidosAtendidos()) {
				for (Pessoa pessoa : pessoas) {
					if (pedido.getPessoas().contains(pessoa)) {
						flag = true;

						double parcela = ((double) pedido.getQuantidade())
								/ pedido.getPessoas().size();
						parcela = Math.round(parcela * 100.0) / 100.0;
						resumoFiltrado.addQnt(parcela);
						resumoFiltrado.addValor(pedido.getParcelaPorPessoa());
					}
				}
			}
			if (flag) {
				total += resumoFiltrado.getValor();
			}
		}

		if (porcentagem > 0.0) {
			total *= porcentagem;
		}

		DecimalFormat df = new DecimalFormat("0.00");
		String valor = df.format(total).replace(".", ",");

		((TextView) getView().findViewById(R.id.valorTotal)).setText("R$"
				+ valor);
	}

	private String getNomesPessoas() {
		String ret = "";
		int tot = 0;

		ListView grid = (ListView) getView().findViewById(R.id.pessoasLV);
		for (int j = 0; j < grid.getChildCount(); j++) {
			View tr = grid.getChildAt(j);
			LinearLayout trf = (LinearLayout) tr
					.findViewById(R.id.pessoasCLICB);
			PessoaCheckBox pcb = (PessoaCheckBox) trf.getChildAt(0);
			if (pcb.isChecked()) {
				tot++;
				if (ret != "") {
					ret += ", ";
				}
				ret += pcb.getPessoa().getNome();
			}
		}

		if (tot == grid.getChildCount())
			ret = "Todos";
		return ret;
	}

	private List<Pessoa> getPessoasChecked() {
		ListView grid = (ListView) getView().findViewById(R.id.pessoasLV);
		List<Pessoa> pessoas = new ArrayList<Pessoa>();

		for (int j = 0; j < grid.getChildCount(); j++) {
			View tr = grid.getChildAt(j);
			LinearLayout trf = (LinearLayout) tr
					.findViewById(R.id.pessoasCLICB);
			PessoaCheckBox pcb = (PessoaCheckBox) trf.getChildAt(0);
			if (pcb.isChecked()) {
				pessoas.add(pcb.getPessoa());
			}
		}
		return pessoas;
	}

	private void marcaTodos() {
		ListView grid = (ListView) getView().findViewById(R.id.pessoasLV);

		for (int j = 0; j < grid.getChildCount(); j++) {
			View tr = grid.getChildAt(j);
			LinearLayout trf = (LinearLayout) tr
					.findViewById(R.id.pessoasCLICB);
			PessoaCheckBox pcb = (PessoaCheckBox) trf.getChildAt(0);
			//			pcb.setChecked(false);
			pcb.setChecked(true);
		}
	}

	public void desmarcaTodos() {
		ListView grid = (ListView) getView().findViewById(R.id.pessoasLV);

		for (int j = 0; j < grid.getChildCount(); j++) {
			View tr = grid.getChildAt(j);
			LinearLayout trf = (LinearLayout) tr
					.findViewById(R.id.pessoasCLICB);
			PessoaCheckBox pcb = (PessoaCheckBox) trf.getChildAt(0);
			//			pcb.setChecked(false);
			pcb.setChecked(false);
		}

		atualizaDados();
	}

	class ResumoFiltrado {
		private String nomeItem;
		private double quantidade;
		private double valor;

		public ResumoFiltrado(String nomeItem, double quantidade, double valor) {
			this.nomeItem = nomeItem;
			this.quantidade = quantidade;
			this.valor = valor;
		}

		public void addValor(double parcelaPorPessoa) {
			this.valor += parcelaPorPessoa;
		}

		public void addQnt(double qnt) {
			this.quantidade += qnt;
		}

		public String getNomeItem() {
			return nomeItem;
		}

		public void setNomeItem(String nomeItem) {
			this.nomeItem = nomeItem;
		}

		public double getQuantidade() {
			return quantidade;
		}

		public void setQuantidade(double quantidade) {
			this.quantidade = quantidade;
		}

		public double getValor() {
			return valor;
		}

		public void setValor(double valor) {
			this.valor = valor;
		}

	}

	class PedidosArrayAdapter extends ArrayAdapter<ResumoFiltrado> {

		public PedidosArrayAdapter(Context context, int textViewResourceId) {
			super(context, textViewResourceId);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ResumoFiltrado resumo = getItem(position);

			convertView = getLayoutInflater(getArguments()).inflate(
					R.layout.conta_list_item, null);

			DecimalFormat df = new DecimalFormat("0.00");
			String valor = df.format(resumo.getValor()).replace(".", ",");

			((TextView) convertView.findViewById(R.id.contaLINome))
			.setText(resumo.getNomeItem());
			((TextView) convertView.findViewById(R.id.contaLINome))
			.setTextColor(0xFFFFD700);
			((TextView) convertView.findViewById(R.id.contaLIQnt))
			.setText(" - (" + resumo.getQuantidade() + " unidades)");
			((TextView) convertView.findViewById(R.id.contaLIValor))
			.setText(valor);

			return convertView;
		}

	}

	class PessoasArrayAdapter extends ArrayAdapter<Pessoa> {

		public PessoasArrayAdapter(Context context, int textViewResourceId) {
			super(context, textViewResourceId);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Pessoa pessoa = getItem(position);

			convertView = getLayoutInflater(getArguments()).inflate(
					R.layout.pessoas_conta_list_item, null);

			DecimalFormat df = new DecimalFormat("0.00");
			String valor = df.format(pessoa.getValor()).replace(".", ",");

			PessoaCheckBox pc = new PessoaCheckBox(getContext(), pessoa, valor);

			((LinearLayout) convertView.findViewById(R.id.pessoasCLICB))
			.removeAllViews();
			((LinearLayout) convertView.findViewById(R.id.pessoasCLICB))
			.addView(pc);

			pc.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//				@Override
				public void onCheckedChanged(CompoundButton buttonView,
						boolean isChecked) {
					atualizaDados();
				}
			});

			return convertView;
		}

	}

}